home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / C64 / T-TPUG Old Monthly Disks / (c)t9.d64 / disk map.c (.txt) < prev    next >
Commodore BASIC  |  2007-02-04  |  11KB  |  320 lines

  1. 1 REM  DISKMAP - SHOWS 1541 ETC FILE STRUCTURE (AND ERRORS)
  2. 2 REM AUTHOR A.R. PEPPER - LAST MODIFIED MAR 7, 1984  BY A.R. PEPPER
  3. 10 GOTO 9000
  4. 190 REM /*
  5. 191 REM  * GOSUB 200
  6. 192 REM  * SPECIALIZED SUBROUTINE FOR CONVERTING AND PRINTING SECTOR NUMBERS
  7. 193 REM  * REQUIRES: A(TRACK) AND B(SECTOR) AS INPUT
  8. 195 REM  * SETS: A$ AS OUTPUT  "(T,S)"
  9. 196 REM  * CHANGES: B$
  10. 197 REM  */
  11. 200 A$=STR$(A): B$=STR$(B)
  12. 210 A$="("+RIGHT$(A$,LEN(A$)-1)+","+RIGHT$(B$,LEN(B$)-1)+")"
  13. 230 RETURN
  14. 311 REM /*
  15. 312 REM  * GOSUB 315 - CHECK DISK ERROR STATUS BY READING FILE 15
  16. 313 REM  *   IT IS ASSUMED THAT THE CALLER WILL USE STATUS AS WANTED
  17. 314 REM  */
  18. 315 INPUT#15,EN,EM$,ET,ES: RETURN
  19. 411 REM /*
  20. 412 REM  * GOSUB 415 - CHECK DISK STATUS AND ABORT IF NON-ZERO
  21. 413 REM  */
  22. 415 GOSUB 315: IF EN=0 THEN RETURN
  23. 420 PRINT"DISK ERROR";EN;EM$;ET;ES;"--PROGRAM ABORTED": GOTO 63900
  24. 491 REM /*
  25. 492 REM  * GOSUB 500 - RETURN FILENAME A FROM NAME TABLE, APPENDING EXTENSION
  26. 493 REM  *   NAME IS RETURNED IN S$; A IS CHANGED
  27. 494 REM  */
  28. 500 S$=DN$(A)+",": A=DE%(A)
  29. 510 IF (A AND 127)>4 THEN S$=S$+TY$(4): GOTO 530
  30. 520 S$=S$+TY$(A AND 127)
  31. 530 IF (A AND 128)=0 THEN S$=S$+"*"
  32. 540 RETURN
  33. 591 REM /*
  34. 592 REM  * GOSUB 600 - CONVERT BF%(T,S)+BU%(T,S,*) TO EXTERNAL FORMAT
  35. 593 REM  *   EXTERNAL FORMAT IS PLACED IN BU$
  36. 594 REM  *   CHANGES A,B, A$,B$, S$
  37. 595 REM  */
  38. 600 BU$="": A=BF%(T,S): IF A < 0 THEN A=A+2: BU$="X"
  39. 610 BU$=MID$("FA",A+1,1)+BU$
  40. 620 IF BU%(T,S,0)=0 THEN 710
  41. 630 A=BU%(T,S,1): B=BU%(T,S,2): GOSUB 200: A=BU%(T,S,0)-1: GOSUB 500
  42. 640 BU$=BU$+" "+A$+"<-"+S$
  43. 650 IF BU%(T,S,3)=0 THEN 710
  44. 660 A=BU%(T,S,4): B=BU%(T,S,5): GOSUB 200: A=BU%(T,S,3)-1: GOSUB 500
  45. 670 BU$=BU$+" "+A$+"<-"+S$
  46. 680 IF BU%(T,S,6)=0 THEN 710
  47. 690 A=BU%(T,S,7): B=BU%(T,S,8): GOSUB 200: A=BU%(T,S,6)-1: GOSUB 500
  48. 700 BU$=BU$+" "+A$+"<-"+S$
  49. 710 A=LT%(T,S): B=LS%(T,S): GOSUB 200
  50. 720 BU$=BU$+"->"+A$
  51. 730 RETURN
  52. 790 REM /*
  53. 791 REM  * GOSUB 800 - CHECK WHETHER T,S ARE A VALID BLOCK ADDRESS
  54. 792 REM  *
  55. 793 REM  *  ARRAY SZ%() MUST HAVE BEEN SET UP
  56. 794 REM  *  A IS SET TO THE TRUTH VALUE FOR (T,S) IS VALID
  57. 795 REM  *
  58. 796 REM  *  B, A$,B$ ARE CHANGED IFF A IS FALSE     (IHB!)
  59. 797 REM  */
  60. 800 A = (0<T AND T<=MT) AND (0<=S AND S<SZ%(T)): IF A THEN RETURN
  61. 810 REM ** ROUTINE IS DESIGNED FOR INTERACTIVE MODE USE, SO REPORT ERROR
  62. 820 A=T:B=S: GOSUB 200
  63. 830 PRINT "CURRENT TRACK AND SECTOR PAIR ";A$;" IS BAD"
  64. 840 A = 0: RETURN
  65. 9000 DK$="0": DV=8:  OPEN 15,DV,15,"I"+DK$
  66. 9500 OU=4:INPUT"OUTPUT DEVICE (3 OR 4)";OU
  67. 9510 IF OU<>3 AND OU<>4 THEN 9500
  68. 9520 OPEN 4,4,7
  69. 9530 OPEN 3,3
  70. 10000 FC=0: FB=0: A1=0: F1=0: F2=0
  71. 10010 MT=35: MS=23: BS=3: C0$=CHR$(0)
  72. 10015 SS$=CHR$(160)
  73. 10020 DIM BM%(MT,BS), SZ%(MT): MF=145
  74. 10025 DIM LS%(MT,MS), LT%(MT,MS), DN$(MF), DE%(MF), DT%(MF), DS%(MF), DZ%(MF)
  75. 10030 DIM BF%(MT,MS): REM ** BLOCK FLAGS; 0 FREE; 1 ALLOCATED; <0 INVALID
  76. 10031 DIM BU%(MT,MS,8): REM ** BLOCK USAGE TABLE; UP TO 3 FILES
  77. 10032 DIM CC(1): REM ** COUNTER; CC(0) FREE BLOCK; CC(1) ALLOCATED
  78. 10033 DIM TY$(5): REM ** FILE TYPES
  79. 10035 DATA DEL,SEQ,PRG,USR,REL,BAD
  80. 10040 DATA 1,17,21, 18,24,19
  81. 10050 DATA 25,30,18, 31,35,17
  82. 10055 FOR I=0 TO 5: READ TY$(I): NEXT I
  83. 10060 DF=8: OPEN DF,DV,8,"$"+DK$: GOSUB 415
  84. 10070 GET#DF,A$,A$: REM ** SKIP 1ST 2 BYTES
  85. 10090 REM /*
  86. 10091 REM  * NOW INTERPRET THE BAM; READ DATA STATEMENTS TO
  87. 10092 REM  *  DETERMINE CORRECT # OF SECTORS PER TRACK
  88. 10093 REM  */
  89. 10100 FOR I=1 TO 4
  90. 10110 READ L,H,N: REM ** TRACKS L TO H HAVE N SECTORS
  91. 10120 FOR J=L TO H
  92. 10130 SZ%(J)=N
  93. 10150 GET#DF,A$: IF A$="" THEN A$=C0$
  94. 10175 A=ASC(A$): F2=F2+A: BM%(J,0)=A
  95. 10180 K1=0: FOR K=1 TO BS
  96. 10185 GET#DF,A$: IF A$="" THEN A$=C0$
  97. 10190 M=ASC(A$):BM%(J,K)=M:M2=1
  98. 10210 FOR K2=0 TO 7: A= -((M AND M2)=0): BF%(J,K1)=A: CC(A)=CC(A)+1
  99. 10230 K1=K1+1: M2=M2+M2: REM ** SHIFT M2 LEFT 1
  100. 10240 NEXT K2
  101. 10250 NEXT K
  102. 10255 REM /*
  103. 10256 REM  * EACH BAM ENTRY COULD REPRESENT 24 BLOCKS
  104. 10257 REM  * MARK AS INVALID BLOCKS GREATER THAN NUMBER IN TRACK
  105. 10258 REM  *  - NORMALLY WILL BE "ALLOCATED"; FREE WOULD BE BAD BAM
  106. 10259 REM  */
  107. 10260 K=N
  108. 10270 IF K<=MS THEN A=BF%(J,K): BF%(J,K)=A-2: CC(A)=CC(A)-1: K=K+1: GOTO 10270
  109. 10280 NEXT J
  110. 10290 NEXT I
  111. 10500 S$="": FOR I=144 TO 170
  112. 10510 GET#DF,A$: S$=S$+CHR$(ASC(A$+C0$) AND 127)
  113. 10520 NEXT I
  114. 10530 PRINT#OU,S$: REM ** DISK NAME
  115. 10540 FOR I=171 TO 255: GET#DF,A$: NEXT I: REM ** SKIP TO END OF BLOCK
  116. 10990 REM /*
  117. 10991 REM  * NOW COMPILE A LIST OF THE FILE NAMES
  118. 10992 REM  *  THEIR STARTING BLOCKS AND SIZES
  119. 10993 REM  */
  120. 11000 NF=0
  121. 11010 IF NF=0 THEN 11020: REM ** SKIP 2 BYTES EVERY 8 ENTRIES
  122. 11015 GET#DF,A$
  123. 11016 GET#DF,A$
  124. 11020 NF=NF+1: IF NF>=8 THEN NF=0
  125. 11030 GET#DF,E$: IF E$="" THEN E$=C0$
  126. 11040 GET#DF,T$,S$
  127. 11050 E=ASC(E$): REM EXTENSION
  128. 11060 T=ASC(T$+C0$): REM TRACK
  129. 11070 S=ASC(S$+C0$): REM SECTOR
  130. 11080 A=E AND 127: IF A>4 THEN A=5
  131. 11090 T$=TY$(A): IF (E AND 128)=0 THEN T$=T$+"*"
  132. 11100 S$="": I=3
  133. 11110 GET#DF,A$: IF A$<>SS$ THEN S$=S$+A$: IF I<18 THEN I=I+1: GOTO 11110
  134. 11120 IF I<27 THEN GET#DF,A$: I=I+1: GOTO 11120
  135. 11130 GET#DF,A$,B$: RS=ST
  136. 11135 X=ASC(A$+C0$)+256*ASC(B$+C0$): REM FILE SIZE (ALLEGEDLY)
  137. 11145 IF (E AND 128)=0 THEN BC=BC+1: BB=BB+X:  REM ** BADLY CLOSED FILE
  138. 11150 DN$(FC)=S$: DE%(FC)=E: DT%(FC)=T: DS%(FC)=S: DZ%(FC)=X: FB=FB+X
  139. 11155 A=T: B=S: GOSUB 200: A=FC: GOSUB 500: FC=FC+1
  140. 11160 PRINT#OU,S$;LEFT$("                    ",21-LEN(S$));X;"FROM";A$
  141. 11220 IF RS=0 THEN 11010
  142. 11250 IF RS<>64 THEN PRINT"ERROR RS=";RS
  143. 11290 REM /*
  144. 11291 REM  * NOW WE ACCESS THE DISK RANDOMLY TO BUILD A PICTURE OF
  145. 11292 REM  * THE LINKS BETWEEN THE BLOCKS ON THE DISK
  146. 11293 REM  */
  147. 11300 CLOSE DF: FOR I=1 TO 1000: NEXT I: OPEN DF,DV,8,"#"
  148. 11310 PRINT
  149. 11320 FOR T=1 TO MT
  150. 11330 PRINT "TRACK";T;CHR$(145);CHR$(13);
  151. 11340 FOR S=0 TO SZ%(T)-1
  152. 11350 PRINT#15,"U1:8,";DK$;T;S: INPUT#15,EN,EM$,ET,ES: IF EN<>0 THEN 11392
  153. 11370 GET#DF,A$: IF A$="" THEN A$=C0$
  154. 11375 LT%(T,S) = ASC(A$)
  155. 11380 GET#DF,A$: IF A$="" THEN A$=C0$
  156. 11385 LS%(T,S) = ASC(A$)
  157. 11390 NEXT S: GOTO 11400: REM ** ERROR HANDLING HERE TO SPEED SECTOR LOOP UP
  158. 11392 PRINT "DISK ERROR";EN;EM$;ET;ES: CLOSE DF: CLOSE 15
  159. 11393 OPEN 15,DV,15,"I"+DK$: OPEN DF,DV,8,"#"
  160. 11394 LT%(T,S)=-1: LS%(T,S)=-1: GOTO 11390
  161. 11400 NEXT T
  162. 11410 CLOSE DF: CLOSE 15
  163. 11510 PRINT#OU,FC-BC;"GOOD FILES TOTALLING";FB-BB;"BLOCKS"
  164. 11520 PRINT#OU,BC;"BAD FILES TOTALLING";BB;"BLOCKS"
  165. 11530 PRINT#OU,"BITMAP SHOWS";CC(1);" BLOCKS ALLOCATED;";CC(0);"(";F2;") FREE"
  166. 11540 A=INT(FC/8)+1: PRINT#OU,FC;"FILE ENTRIES IN";A;"DIRECTORY BLOCKS"
  167. 11990 REM /*
  168. 11991 REM  * NOW TRACE DOWN THE LINKED LIST OF BLOCKS FOR EACH FILE,
  169. 11992 REM  *  AND NOTE ANY INCONSISTENCIES
  170. 11993 REM  */
  171. 12000 FOR I=0 TO FC-1: REM ** FOR EACH FILE IN DIRECTORY
  172. 12020 T=DT%(I): REM ** INITIAL TRACK
  173. 12025 T1=0: REM ** INITIAL PREVIOUS TRACK (DUMMY)
  174. 12030 S=DS%(I): REM ** INITIAL SECTOR
  175. 12035 S1=0: REM ** INITIAL PREVIOUS SECTOR (DUMMY)
  176. 12040 X=DZ%(I): REM ** ALLEGED FILE SIZE
  177. 12050 J=0: REM ** BLOCK COUNTER
  178. 12060 IF 0<T AND T<=MT THEN IF 0<=S AND S<SZ%(T) THEN 12100
  179. 12065 A=T1:B=S1:GOSUB 200: A=I:GOSUB 500
  180. 12070 PRINT#OU,S$;" BAD TRACK&SECTOR POINTER; BLOCK";J;A$;
  181. 12075 A=T:B=S:GOSUB 200: PRINT#OU,"->"A$
  182. 12080 GOTO 12300
  183. 12100 J=J+1: IF BU%(T,S,0)<>0 THEN E$="MULTIPLELY ": GOTO 12110
  184. 12105 IF BF%(T,S)=1 THEN 12130
  185. 12106 E$="UN":GOSUB 200
  186. 12110 A=I: GOSUB 500: PRINT#OU,"ERROR IN ";S$;"(BLOCK";J;"):";
  187. 12115 A=T: B=S: GOSUB 200: PRINT#OU,E$;"ALLOCATED BLOCK ";A$
  188. 12120 GOSUB 600: PRINT#OU,BU$
  189. 12130 K=0
  190. 12135 IF K < 9 THEN IF BU%(T,S,K)<>0 THEN K=K+3: GOTO 12135
  191. 12136 IF K < 9 THEN BU%(T,S,K)=I+1:BU%(T,S,K+1)=T1:BU%(T,S,K+2)=S1: GOTO 12145
  192. 12140 A=T:B=S:GOSUB200:PRINT#OU,"BLOCK ";A$;" HAS TOO MANY REFERENCES TO RECORD"
  193. 12145 T1=T: S1=S: T=LT%(T1,S1): S=LS%(T1,S1)
  194. 12150 IF J<X THEN 12200
  195. 12160 IF J=X THEN IF T=0 THEN 12300: REM ** NORMAL END-OF-FILE
  196. 12170 A=T1:B=S1:GOSUB 200: A=I: GOSUB 500
  197. 12175 PRINT#OU,"FILE ";S$;" NOT ENDED AT BLOCK COUNT";X;A$;
  198. 12180 A=T:B=S:GOSUB 200: PRINT#OU,"->";A$
  199. 12190 GOTO 12300: REM ** IF WE CONTINUED ON LIST, WE MIGHT LOOP
  200. 12200 IF T<>0 THEN 12060: REM **  NORMAL GOOD BLOCK IN MIDDLE OF FILE
  201. 12205 A=T1:B=S1:GOSUB 200: A=I: GOSUB 500
  202. 12210 PRINT#OU,"FILE ";S$;" ENDS PREMATURELY:  BLOCK";J;A$;
  203. 12215 A=T:B=S:GOSUB 200: PRINT#OU,"->";A$
  204. 12300 NEXT I
  205. 12990 A$="N": INPUT"GIVE COMPLETE MAP";A$
  206. 12995 A$=LEFT$(A$,1): IF A$="N" OR A$="[206]" THEN 14000
  207. 13000 FOR T=1 TO MT
  208. 13010 PRINT#OU
  209. 13020 PRINT#OU,"TRACK";T;":";BM%(T,0);"OF";SZ%(T);"BLOCKS FREE; BAM";
  210. 13030 FOR I=1 TO BS: PRINT#OU,BM%(T,I); : NEXT I
  211. 13040 PRINT#OU
  212. 13150 S=0
  213. 13160 L=S: IF L>MS THEN 13210
  214. 13170 GOSUB 600
  215. 13175 S=S+1: IF S>MS THEN 13190
  216. 13180 IF BF%(T,S)<>BF%(T,L) THEN 13190
  217. 13181 IF BU%(T,L,0) = 0 THEN IF BU%(T,S,0) = 0 THEN 13187
  218. 13184 I=0
  219. 13185 IF I<9 THEN IF BU%(T,S,I)=BU%(T,L,I) THEN I=I+1: GOTO 13185
  220. 13186 IF I<9 GOTO 13190: REM ** NOT IDENTICAL ENTRIES FOR SUCCESSIVE SECTORS
  221. 13187 IF LT%(T,S)=LT%(T,L) THEN IF LS%(T,S)=LS%(T,L) GOTO 13175: REM IDENTICAL
  222. 13190 IF BU$="AX->(0,0)" GOTO 13160
  223. 13195 IF L=S-1 THEN PRINT#OU," SECTOR";L;BU$: GOTO 13160
  224. 13200 PRINT#OU," SECTOR";L;"TO";S-1;BU$: GOTO 13160
  225. 13210 NEXT T
  226. 13990 REM /*
  227. 13991 REM  * INTERACTIVE MODE
  228. 13992 REM  */
  229. 14000 OU=3: REM ** SET OUTPUT TO SCREEN
  230. 14010 T=0: S=0
  231. 14020 A=T: B=S: GOSUB 200: PRINT A$;
  232. 14025 INPUT "(A,B,C,D,H,F,N,O,T,$,QUIT)";A$: IF A$="QUIT" THEN 63900
  233. 14030 B$=LEFT$(A$,1): A$=RIGHT$(A$,LEN(A$)-1)
  234. 14040 IF B$="A" THEN GOSUB 14100: GOTO 14020
  235. 14045 IF B$="B" THEN GOSUB 14170: GOTO 14020
  236. 14050 IF B$="C" THEN GOSUB 14600: GOTO 14020
  237. 14055 IF B$="D" THEN GOSUB 14200: GOTO 14020
  238. 14060 IF B$="F" THEN GOSUB 14300: GOTO 14020
  239. 14065 IF B$="H" THEN GOSUB 14400: GOTO 14020
  240. 14070 IF B$="N" THEN GOSUB 14700: GOTO 14020
  241. 14075 IF B$="O" THEN GOSUB 14800: GOTO 14020
  242. 14080 IF B$="T" THEN GOSUB 14900: GOTO 14020
  243. 14085 IF B$="$" THEN GOSUB 15000: GOTO 14020
  244. 14089 PRINT"INVALID COMMAND ";B$
  245. 14090 A=OU: OU=3: GOSUB 14400: OU=A: GOTO 14020
  246. 14100 REM ** 14100 - A - ALLOCATE CURRENT T&S
  247. 14110 GOSUB 800: IF NOT A THEN RETURN
  248. 14120 OPEN 15,DV,15,"I"+DK$: OPEN DF,DV,8,"#": REM MUST OPEN TO FORCE BAM WRITE
  249. 14125 PRINT#15,"B-A:";DK$;T;S: GOSUB 315: CLOSE DF: CLOSE 15
  250. 14130 A=T:B=S:GOSUB 200
  251. 14140 IF EN=0 THEN PRINT#OU,"BLOCK ";A$;" ALLOCATED": BF%(T,S)=1: RETURN
  252. 14150 IF EN=65 THEN PRINT"BLOCK ";A$;" WAS ALREADY ALLOCATED": RETURN
  253. 14160 PRINT"UNEXPECTED DISK STATUS ";EN;EM$;ET;ES: RETURN
  254. 14170 REM ** 14170 - B - BLOCK SET CURRENT TRACK&SECTOR
  255. 14180 INPUT"TRACK,SECTOR";T,S
  256. 14190 GOSUB 800: IF A THEN GOSUB 14600
  257. 14195 RETURN
  258. 14200 REM ** 14200 - D - DIRECTORY ENTRY; DISPLAY DIRECTORY ENTRY VAL(B$)
  259. 14210 C=VAL(A$): REM  ** 14220 IS ENTRY POINT FOR OTHER ROUTINES
  260. 14220 IF 0<=C THEN IF C<FC THEN 14240
  261. 14230 PRINT "DIRECTORY ENTRY NUMBER";C;"OUT OF RANGE": RETURN
  262. 14240 A=C: GOSUB 500: T=DT%(C): S=DS%(C): A=T: B=S:  GOSUB 200
  263. 14250 PRINT#OU,C;S$;LEFT$("                        ",21-LEN(S$));
  264. 14260 PRINT#OU,DZ%(C);"FROM";A$
  265. 14270 RETURN
  266. 14300 REM ** 14300 - F - FREE; ISSUE A BLOCK-FREE FOR CURRENT BLOCK
  267. 14310 GOSUB 800: IF NOT A THEN RETURN
  268. 14320 A=T:B=S: GOSUB 200
  269. 14330 PRINT "YOU REALLY WANT TO FREE BLOCK ";A$;
  270. 14340 A$="N": INPUT A$
  271. 14350 A$=LEFT$(A$,1): IF A$<>"Y" THEN IF A$<>"[217]" THEN RETURN
  272. 14360 OPEN 15,DV,15,"I"+DK$: OPEN DF,DV,8,"#": REM MUST OPEN TO FORCE BAM WRITE
  273. 14365 PRINT#15,"B-F:";DK$;T;S: GOSUB 315: CLOSE DF: CLOSE 15
  274. 14370 A=T:B=S:GOSUB 200
  275. 14380 IF EN=0 THEN PRINT#OU,"BLOCK ";A$;" FREED": BF%(T,S)=0: RETURN
  276. 14390 PRINT"UNEXPECTED DISK STATUS ";EN;EM$;ET;ES;" ON BLOCK-FREE"
  277. 14395 RETURN
  278. 14400 REM ** 14400 - H - HELP; GET SOME HELP
  279. 14410 PRINT#OU,"A - ALLOCATE CURRENT T&S (FOR REAL, ON DISK)"
  280. 14420 PRINT#OU,"B - BLOCK; SET T&S (PROMPTED FOR)"
  281. 14430 PRINT#OU,"C - CURRENT; DISPLAY MAP ENTRY FOR CURRENT T&S"
  282. 14440 PRINT#OU,"D<N> - DIRECTORY; DISPLAY DIRECTORY ENTRY N"
  283. 14450 PRINT#OU,"F - FREE CURRENT T&S (FOR REAL, ON DISK-BE CAREFUL!)"
  284. 14460 PRINT#OU,"H - HELP; GET THIS LIST ON OUTPUT DEVICE"
  285. 14470 PRINT#OU,"N - NEXT; DISPLAY CURRENT MAP ENTRY THEN GO TO NEXT LINK"
  286. 14480 PRINT#OU,"O<N> - OUTPUT; SEND (MOST) OUTPUT TO DEVICE N (3 OR 4)"
  287. 14485 PRINT#OU,"T - TRACE; TRACE BLOCK LIST FROM CURRENT T&S"
  288. 14490 PRINT#OU,"$ - DISPLAY ENTIRE DIRECTORY OR LOOK FOR FILE NAME"
  289. 14500 PRINT#OU,"QUIT - QUIT; PUT AN END TO ALL THIS NONSENSE"
  290. 14510 RETURN
  291. 14600 REM ** 14600 - C - CURRENT; DISPLAY THE MAP ENTRY FOR CURRENT T&S
  292. 14610 GOSUB 800: IF NOT A THEN RETURN
  293. 14620 GOSUB 600: A=T:B=S: GOSUB 200
  294. 14630 PRINT#OU,A$;":";BU$
  295. 14640 RETURN
  296. 14700 REM ** 14700 - N - NEXT; DISPLAY CURRENT MAP ENTRY, SET T&S TO NEXT
  297. 14710 GOSUB 800: IF NOT A THEN RETURN
  298. 14720 GOSUB 14600
  299. 14730 A=T: T=LT%(T,S): S=LS%(A,S)
  300. 14740 RETURN
  301. 14800 REM ** 14800 - O - OUTPUT; SET OUTPUT DEVICE
  302. 14810 A=VAL(A$): IF 3<=A THEN IF A<=4 THEN OU=A: RETURN
  303. 14820 PRINT "INVALID OUTPUT DEVICE (MUST BE 3 OR 4)";A
  304. 14830 RETURN
  305. 14900 REM ** 14900 - T - TRACE; FOLLOW THE CURRENT LIST OF BLOCKS
  306. 14910 GOSUB 800:  IF NOT A THEN RETURN
  307. 14915 GET A$: IF A$<>"" THEN 14915
  308. 14920 GOSUB 14700: GET A$: IF A$<>"" THEN RETURN
  309. 14930 IF 1<=T AND T<=MT THEN IF 0<=S AND S<=SZ%(T) GOTO 14920
  310. 14940 RETURN
  311. 15000 REM ** 15000 - $ - SHOW DIRECTORY, OR SET CURRENT BLOCK FROM FILE
  312. 15010 IF A$="" THEN FOR I=0 TO FC-1: C=I: GOSUB 14220: NEXT I: RETURN
  313. 15020 C=0
  314. 15030 IF C >= FC THEN PRINT"NO SUCH FILE AS ";A$: RETURN
  315. 15040 IF DN$(C)<>A$ THEN C=C+1: GOTO 15030
  316. 15050 GOSUB 14220
  317. 15060 RETURN
  318. 63900 CLOSE 3: CLOSE 4: CLOSE DF: CLOSE 15
  319. 63999 END
  320.